symbolic-ppdb 12.8.0

A library for parsing and performing lookups on Portable PDB files.
docs.rs failed to build symbolic-ppdb-12.8.0
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Visit the last successful build: symbolic-ppdb-12.2.0

Provides support for reading Portable PDB files, specifically line information resolution for functions.

Portable PDB is a debugging information file format for Common Language Infrastructure (CLI) languages. It is an extension of the ECMA-335 format.

Functionality

  • Parse Portable PDB files with [PortablePdb::parse].
  • Convert Portable PDB files to PortablePdbCaches with [PortablePdbCacheConverter::process_portable_pdb].
  • Serialize PortablePdbCaches with [PortablePdbCacheConverter::serialize] and parse them with [PortablePdbCache::parse].
  • Look up line information for a function on a PortablePdbCache with [PortablePdbCache::lookup].

Example

use symbolic_testutils::fixture;
use symbolic_ppdb::{LineInfo, PortablePdb, PortablePdbCacheConverter, PortablePdbCache};

let buf = std::fs::read(fixture("windows/portable.pdb")).unwrap();
let pdb = PortablePdb::parse(&buf).unwrap();

let mut converter = PortablePdbCacheConverter::new();
converter.process_portable_pdb(&pdb).unwrap();
let mut buf = Vec::new();
converter.serialize(&mut buf).unwrap();

let cache = PortablePdbCache::parse(&buf).unwrap();
let line_info = cache.lookup(7, 10).unwrap();
assert_eq!(line_info.line, 81);

Structure of a Portable PDB file

An ECMA-335 file is divided into sections called streams. The possible streams are:

  • #~ ("metadata"), comprising information about classes, methods, modules, &c., organized into tables adhering to various schemas. The original ECMA-335 tables are described in Section II.22 of the ECMA-335 spec, the tables added by Portable PDB are described in the Portable PDB spec. The MethodDebugInformation table is of particular interest to symbolic, as it contains line information for functions.
  • #Strings, comprising null-terminated UTF-8 strings.
  • #GUID, a list of GUIDs.
  • #US ("user strings"), comprising UTF-16 encoded strings.
  • #Blob, comprising blobs of data that don't fit in any of the other streams.

The Portable PDB format extends ECMA-335 by the addition of another steam, #PDB, as well as several tables to the #~ stream.